package com.iweb.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    // 密钥，用于签名和验证 JWT, 保密
    private static final String SECRET_KEY = "student";
    // JWT 的过期时间，这里设置为 30 分钟
    private static final long EXPIRATION_TIME = 1000 * 60 * 30;

    public static String generateToken(String subject) {
        Map<String, Object> claims = new HashMap<>();
        return generateToken(subject, claims);
    }

    /**
     * @param subject 唯一的 uuid
     * @param claims  数据需要保存的数据, 数据量不要太大, 不要有敏感数据 比如密码
     * @return
     */
    public static String generateToken(String subject, Map<String, Object> claims) {
        return Jwts.builder()
            .setClaims(claims)
            .setSubject(subject)
            .setIssuedAt(new Date(System.currentTimeMillis()))
            .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
            .compact();
    }

    /**
     * 解析 JWT，获取其中的 Claims
     *
     * @param token JWT
     * @return Claims 对象
     */
    public static Claims extractClaims(String token) {
        return Jwts.parser()
            .setSigningKey(SECRET_KEY)
            .parseClaimsJws(token)
            .getBody();
    }

    /**
     * 从 JWT 中获取主题
     *
     * @param token JWT
     * @return 主题
     */
    public static String extractSubject(String token) {
        return extractClaims(token).getSubject();
    }

    /**
     * 验证 JWT 是否有效
     *
     * @param token JWT
     * @return 是否有效
     */
    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) {
        // 示例：生成一个 JWT
        Map<String, Object> claims = new HashMap<>();
        claims.put("user", "admin");
        String token = generateToken("user123", claims);
        System.out.println("Generated Token: " + token);

//        // 示例：验证 JWT
//        boolean isValid = validateToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIiwiZXhwIjoxNzQxOTI1NTUxLCJpYXQiOjE3NDE5MjM3NTF9.mX1UM12iCdEGBSHf4srjUOYmPoZjQVkZEYBgfQ8y5KA");
//        System.out.println("Is Token Valid: " + isValid);
//
//        // 示例：从 JWT 中提取主题
//        String subject = extractSubject(token);
//        System.out.println("Extracted Subject: " + subject);

        Claims claims1 = JwtUtil.extractClaims("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIiwiZXhwIjoxNzQxOTI1ODE3LCJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE3NDE5MjQwMTd9.a3bwf8pnXUz4TmZl4WlZNRGnM44nH3C-Ldw-icxI6wo");
        Object user = claims1.get("user");
        System.out.println(user);
    }
}
